

import json
import random


import requests

from djcelery.app import app





# 定义客户端ID和密钥
client_id = 'ZMrISh8ansCd42DKyTvMRRRe'
client_secret = 'Tdm5RLmaCm0A66ItZ81Gn6nOd38Ko3wz'




def unit_chat(chat_input, user_id=13799269106):
    chat_reply = '谢谢,客服不在，请稍等'
    # 请求百度智能云获取access_token
    url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s" % (
        client_id, client_secret)
    # 获取地址
    ret = requests.get(url)
    # 获取access_token
    access_token = eval(ret.text)['access_token']

    # 构造请求参数
    post_data = {
        "log_id": str(random.random()),
        "request": {
            "query": chat_input,
            "user_id": user_id
        },
        "session_id": "",
        "service_id": "S103516",
        "version": "2.0"
    }
    # 调用百度智能云API生成回复    这个地址是固定的

    unit_chatbot_url = "https://aip.baidubce.com/rpc/2.0/unit/service/chat?access_token=" + access_token




    # 发送post请求到百度智能云API
    res = requests.post(unit_chatbot_url, json=post_data)

    # 将返回的json字符串转换为字典对象
    unit_chat_obj = json.loads(res.content)

    # 如果返回错误码不为0，则表示调用失败，直接返回默认回复信息
    if unit_chat_obj['error_code'] != 0:
        return chat_reply

    # 获取结果中的response_list字段
    unit_chat_result = unit_chat_obj['result']
    unit_chat_response_list = unit_chat_result['response_list']

    # 随机选择一个confidence大于0.0的回复
    unit_chat_response_obj = random.choice([unit_chat_response for unit_chat_response in unit_chat_response_list if unit_chat_response['schema']['intent_confidence'] > 0.0])

    # 获取action_list字段，并随机选择一个动作
    unit_chat_action = unit_chat_response_obj['action_list']
    unit_chat_action_obj = random.choice(unit_chat_action)

    # 获取say字段，即最终生成的回复信息
    unit_chat_say = unit_chat_action_obj['say']

    # 返回生成的回复信息
    return unit_chat_say


# 进行发送和接收消息
@socketio.on('message')
def handle_message(message):
    # 获取用户发送的消息内容
    chat_input = message.get('msg')
    # 调用unit_chat函数生成回复消息
    result_say = unit_chat(chat_input)
    # 将生成的回复消息添加到原消息中
    message['msg'] = result_say
    # 打印消息内容
    print(message)
    # 广播消息给所有客户端
    send(message, broadcast=True)


# 当客户端开始连接时
@socketio.on('connect', namespace='/chat')
def test_connect():
    # 发送一个自定义事件，并携带数据
    emit('my response', {'data': 'Connected'})


# 当客户端断开连接时
@socketio.on('disconnect', namespace='/chat')
def test_disconnect():
    # 打印客户端断开连接的信息
    print('Client disconnected')


